# tools/authentication.py
import token

from rest_framework.authentication import BasicAuthentication
from rest_framework.exceptions import AuthenticationFailed

from django.utils.translation import gettext_lazy as _

from models.models import User
# 导入你的密码验证函数
from tools.password_hasher import verify_password
from tools.token_tools import CustomTokenTool, generate_is_user_token


class CustomBasicAuthentication(BasicAuthentication):
    """
    完全重写 BasicAuthentication，使用自定义的密码验证逻辑 应用到swaggerui
    """
    def authenticate_credentials(self, userid, password, request=None):
        """
        核心方法：验证用户名和密码
        - 重写为使用你的 verify_password 函数
        """
        # 1. 查找用户（支持 username/email 登录，根据你的模型调整）
        try:
            # 示例：优先用 username 查找，找不到则用 email
            user = User.objects.get(username=userid)
        except User.DoesNotExist:
            try:
                user = User.objects.get(email=userid)
            except User.DoesNotExist:
                # 不暴露“用户不存在”，避免信息泄露
                raise AuthenticationFailed(_('无效的用户名或密码'))
        if not verify_password(password, user.password):
            raise AuthenticationFailed(_('无效的用户名或密码'))
            # 检查 session 中是否有有效的 token
        token = generate_is_user_token(request,user)
        # 4. 验证通过，返回用户对象
        return (user, token)

    def authenticate_header(self, request):
        """指定认证失败时的响应头（DRF 要求实现）"""
        return 'Basic realm="%s"' % self.www_authenticate_realm

# tools/authentication.py（继续添加以下代码）
from drf_spectacular.extensions import OpenApiAuthenticationExtension

class CustomBasicAuthSchema(OpenApiAuthenticationExtension):
    target_class = 'tools.authentication.CustomBasicAuthentication'
    name = 'CustomBasicAuth'
    def get_security_definition(self, auto_schema):
        # 手动定义 Basic 认证的 OpenAPI 规范（兼容旧版本）
        return {
            'type': 'http',
            'scheme': 'basic',
            'description': "使用用户名/密码登录（密码验证逻辑：截断72字节后验证）"
        }